#include <bits/stdc++.h>
using namespace std;
#define pb push_back
#define pii pair<int,int>

const int N=3e5+5,inf=1e9;
int n,x,A,B;
vector<int> E[N],V[N];

namespace Tr{
  int dfn[N],idx=0,fa[N],rev[N],sz[N],st[20][N],d[N],cur;
  
  void dfs(int u,int pre){
    fa[u]=pre,rev[dfn[u]=++idx]=u,sz[u]=1,d[u]=d[pre]+1;
    st[0][idx]=pre;
    for(int v:E[u]) if(v!=pre) dfs(v,u);
  }
  
  int Min(int u,int v){return dfn[u]<dfn[v]?u:v;}
  
  int LCA(int u,int v){
    if(u==v) return u;
    u=dfn[u],v=dfn[v];
    if(u>v) swap(u,v);
    int s=__lg(v-u);
    return Min(st[s][u+1],st[s][v-(1<<s)+1]);
  }
  
  int dis(int u,int v){return d[u]+d[v]-2*d[LCA(u,v)];}  
  
  struct Nod{
  	int v,id;
  	bool operator <(const Nod &a) const{return v<a.v;}
  };
  
  struct nod{
  	Nod fi,se,rd;
  }a[N];
  
  void dfs2(int u,int pre,int dis){
  	if(dis>B) return;
  	cur=min(cur,u);
  	for(int v:E[u]) if(v!=pre) dfs2(v,u,dis+1);
  }
  
  void init(){
    dfs(1,0);
    for(int i=1;i<=__lg(n)+1;i++)
      for(int j=1;j+(1<<i)-1<=n;j++)
        st[i][j]=Min(st[i-1][j],st[i-1][j+(1<<(i-1))]);
  
    for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) if(dis(i,j)==A) V[i].pb(j);
  
    for(int u=1;u<=n;u++){
      a[u].fi=a[u].se=a[u].rd={inf,0};
      for(int v:E[u]){
      	cur=inf,dfs2(v,u,1);
      	Nod tmp={cur,v};
      	if(tmp<a[u].fi) a[u].rd=a[u].se,a[u].se=a[u].fi,a[u].fi=tmp;
      	else if(tmp<a[u].se) a[u].rd=a[u].se,a[u].se=tmp;
      	else if(tmp<a[u].rd) a[u].rd=tmp;
      }
    }
  }
}
using namespace Tr;

map<pii,int> mp;

bool in(int i,int x,int y){
  if(i==x||i==y) return false;
  return dis(x,y)!=dis(i,x)+dis(i,y);
}

int to(int x,int y){
  if(mp.count({x,y})) return mp[{x,y}];
//  cerr<<"to( "<<x<<","<<y<<" ) "<<endl;
  int ans=inf;
  for(int i=1;i<=n;i++) if(dis(x,i)<=B){
    int res=-1;
    for(int j:V[i]) if(!in(i,x,j)&&!in(i,y,j)) res=max(res,to(j,i));
    if(~res) ans=min(ans,res);
    else{
      ans=min(ans,i);
      if(!in(i,x,a[i].fi.id)&&!in(i,y,a[i].fi.id)) ans=min(ans,a[i].fi.v);
      else if(!in(i,x,a[i].se.id)&&!in(i,y,a[i].se.id)) ans=min(ans,a[i].se.v);
      else ans=min(ans,a[i].rd.v);
    }
    // else for(int j=1;j<=n;j++) if(dis(i,j)<=B&&!in(i,x,j)&&!in(i,y,j)) ans=min(ans,j);
  }
  return mp[{x,y}]=ans;
}

int main(){
  freopen("nim.in","r",stdin);
  freopen("nim.out","w",stdout);
  
  ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
  cin>>n>>x>>A>>B;
  for(int i=1,u,v;i<n;i++) cin>>u>>v,E[u].pb(v),E[v].pb(u);
  if(A<=B) cout<<"1\n",exit(0);
  init();
  
//  cerr<<"out?"<<endl;
  
  int ans=-1;
  for(int i:V[x]) ans=max(ans,to(i,x));
  if(~ans) cout<<ans<<'\n',exit(0);
  
  ans=inf;
  for(int i=1;i<=n;i++) if(dis(i,x)<=B) ans=min(ans,i);
  cout<<ans<<'\n';
  return 0;
}
